package controlador;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import modelo.dominio.Condicionante;
import modelo.dominio.Historico;
import modelo.servicio.Condicionantes;
import modelo.servicio.Documentos;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

public class CondicionanteControlador extends HttpServlet {

    private String html = "";

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=ISO-8859-1");
        PrintWriter out = response.getWriter();

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        String carpeta = "";
        if (isMultipart) {
            try {
                List<FileItem> items = null;
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(10240);
                factory.setRepository(new File(SeccionControlador.getDirectorioTemporal()));
                ServletFileUpload upload = new ServletFileUpload(factory);
                try {
                    items = upload.parseRequest(request);
                } catch (FileUploadException ex) {
                    out.println("Error de Parsing:" + ex.getMessage());
                }
                Condicionante cond = new Condicionante();
                String claveDoc = "", tipo = "", desc = "", resp = "", ac = "", tipoGuia = "", numero = "";
                Integer idCond = 0;
                boolean cump = false, peri = false, continuar = false;
                String periodo = "", duracion = "", magnitud = "";
                Date fecha = null;
                for (int i = 0; i < items.size(); i++) {
                    FileItem item = (FileItem) items.get(i);
                    if (item.isFormField()) {
                        //out.println(item.getFieldName() + ": " + item.getString());
                        if (item.getFieldName().equals("ac")) {
                            ac = item.getString();
                        } else if (item.getFieldName().equals("id")) {
                            idCond = Integer.parseInt(item.getString());
                        } else if (item.getFieldName().equals("clv")) {
                            claveDoc = item.getString();
                        } else if (item.getFieldName().equals("tipo")) {
                            tipo = item.getString();
                        } else if (item.getFieldName().equals("desc")) {
                            desc = item.getString();
                        } else if (item.getFieldName().equals("cump")) {
                            cump = true;
                        } else if (item.getFieldName().equals("num")) {
                            numero = item.getString();
                        } else if (item.getFieldName().equals("f_date")) {
                            if (item.getString().trim().length() == 10) {
                                try {
                                    fecha = (new SimpleDateFormat("dd/MM/yyyy")).parse(item.getString().trim());
                                } catch (Exception e) {
                                    fecha = (new SimpleDateFormat("yyyy-MM-dd")).parse(item.getString().trim());
                                }
                            }
                        } else if (item.getFieldName().equals("resp")) {
                            resp = item.getString();
                        } else if (item.getFieldName().equals("peri")) {
                            peri = true;
                        } else if (item.getFieldName().equals("perio")) {
                            periodo = item.getString();
                        } else if (item.getFieldName().equals("dur")) {
                            duracion = item.getString();
                        } else if (item.getFieldName().equals("dur_mag")) {
                            magnitud = item.getString();
                        } else if (item.getFieldName().equals("tipo_guia")) {
                            tipoGuia = item.getString();
                        }
                    } else {
                        cond.setDocumento(Documentos.instancia().obtenerPorId(claveDoc));
                        cond.setTipo(tipo);
                        cond.setDescripcion(desc);
                        cond.setNumero(numero);
                        if (cump) {
                            cond.setFechaCumplimiento(fecha);
                            cond.setResponsable(resp);
                            if (peri) {
                                cond.setPeriodicidad(periodo);
                                cond.setDuracion(duracion + magnitud);
                            }
                        }
                        cond.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));
                        cond.setFechaCumplimiento(fecha);
                        if (ac.equals("sv")) {
                            cond.setIdCondicionante(idCond);
                            cond.getHistorico().setEstado("ED");
                            Condicionantes.instancia().actualizar(cond);
                        } else {
                            Condicionantes.instancia().agregar(cond);
                        }
                        if (!tipoGuia.equals("NA")) {
                            cond            = Condicionantes.instancia().obtenerUltimo();
                            String nombreArchivo = "Guia_" + cond.getIdCondicionante();
                            String fileName = item.getName();
                            int desde       = fileName.lastIndexOf(".") > 0 ? fileName.lastIndexOf(".") : fileName.length();
                            String ext      = fileName.substring(desde, fileName.length());
                            carpeta         = cond.getDocumento().getSeccion().getIdSeccion().toString();
                            String arcc     = SeccionControlador.getDirectorioCarga() + carpeta + "\\" + nombreArchivo + ext;
                            //------------- sin SBM
                            //File fichero = new File(arcc);
                            //item.write(fichero);
                            //------------- con SBM
                            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(SeccionControlador.getUsuarioCIFS());
                            String path   = "smb:" + arcc.replace("\\", "/");
                            SmbFile sFile = new SmbFile(path, auth);
                            SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);
                            InputStream in = item.getInputStream();
                            byte[] buffer  = new byte[SeccionControlador.getTamanioBuffer()];
                            int read;
                            while ((read = in.read(buffer, 0, SeccionControlador.getTamanioBuffer())) != -1) {
                                sfos.write(buffer, 0, read);
                            }
                            sfos.close();
                            in.close();
                            //-------------
                            cond.setRutaGuia(arcc);
                            cond.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));
                            cond.getHistorico().setEstado("CR");
                            cond.setTipoGuia(tipoGuia);
                            Condicionantes.instancia().actualizar(cond);
                        }
                        if (ac.equals("gc")) {
                            request.setAttribute("clv", claveDoc);
                            request.setAttribute("ac", "nw");
                            getServletContext().getRequestDispatcher("/condi").forward(request, response);
                        } else {
                            response.sendRedirect(getServletContext().getContextPath());
                        }
                    }
                }

            } catch (Exception ex) {
                out.println("Error al guardar el condicionante: " + ex.getMessage());
            }
        }

        String accion = request.getAttribute("ac") == null ? "" : request.getAttribute("ac").toString();
        try {
            if (accion.equals("")) {
                accion = request.getParameter("ac") == null ? "" : request.getParameter("ac").toString();
            }
            if (accion.equals("cu")) {
                List<Condicionante> condi = Condicionantes.instancia().obtenerCumplimientoPeriodico(Integer.parseInt(request.getSession().getAttribute("sArea").toString()));
                if (!condi.isEmpty()) {
                    request.setAttribute("condi", condi);
                    getServletContext().getRequestDispatcher("/jsp/termycondi/listado.jsp").forward(request, response);
                } else {
                    out.println("<br/>No hay condicionantes de Cumplimiento");
                }
            } else if (accion.equals("bo")) {
                if (request.getParameter("clv") != null) {
                    Condicionantes.instancia().eliminar(Integer.parseInt(request.getParameter("clv")));
                }
                out.println("Se inactiv&oacute exitosamente el Condicionante");
            } else if (accion.equals("co")) {
                List<Condicionante> condi = Condicionantes.instancia().obtenerConocimiento(Integer.parseInt(request.getSession().getAttribute("sArea").toString()));
                if (!condi.isEmpty()) {
                    request.setAttribute("condi", condi);
                    getServletContext().getRequestDispatcher("/jsp/termycondi/listado.jsp").forward(request, response);
                } else {
                    out.println("<br/>No hay condicionantes de Conocimiento");
                }
            } else if (accion.equals("un")) {
                List<Condicionante> condi = Condicionantes.instancia().obtenerCumplimientoUnico(Integer.parseInt(request.getSession().getAttribute("sArea").toString()));
                if (!condi.isEmpty()) {
                    request.setAttribute("condi", condi);
                    getServletContext().getRequestDispatcher("/jsp/termycondi/listado.jsp").forward(request, response);
                } else {
                    out.println("<br/>No hay condicionantes de cumplimiento &uacute;nico");
                }
            } else if (accion.equals("de")) {
                int idCond = Integer.parseInt(request.getParameter("id"));
                List<Condicionante> condi = new ArrayList<Condicionante>();
                condi.add(Condicionantes.instancia().obtenerPorId(idCond));
                if (condi.isEmpty()) {
                    out.println("<br/>No existe el condicionante");
                } else {
                    request.setAttribute("condi", condi);
                    getServletContext().getRequestDispatcher("/jsp/termycondi/listado.jsp").forward(request, response);
                }
            } else if (accion.equals("fi")) {
                html = "";
                String tipo, f_desde, f_hasta, tipo2, numero;
                Integer area, seccion;
                tipo    = request.getParameter("tipo");
                tipo2   = request.getParameter("tipo2");
                f_desde = request.getParameter("desde");
                f_hasta = request.getParameter("hasta");
                area    = Integer.parseInt(request.getSession().getAttribute("sArea").toString());
                numero  = request.getParameter("num");
                try {
                    seccion = Integer.parseInt(request.getParameter("seccion"));
                } catch (Exception ex) {
                    seccion = 0;
                }

                List<Condicionante> condi = Condicionantes.instancia().obtenerFiltrado(area, numero, seccion, tipo, tipo2, f_desde, f_hasta);
                request.setAttribute("condi", condi);
                getServletContext().getRequestDispatcher("/front?ac=3&v=3").forward(request, response);
            } else if (accion.equals("ls")) {
                getServletContext().getRequestDispatcher("/jsp/termycondi/nuevo.jsp").forward(request, response);
            } else if (accion.equals("nw")) {
                //request.getRequestDispatcher("/").include(request, response);
                //request.getRequestDispatcher("/jsp/indice/header.jsp").include(request, response);
                //request.getRequestDispatcher("/jsp/indice/cuerpo.jsp").include(request, response);
//                String redir = "<script type=\"text/javascript\"> "
//                        + " $(document).ready(function() { "
//                        + " charge('#centro', 'condi?ac=ls&clv=" + request.getAttribute("clv") + "'); "
//                        + "}); "
//                        + "</script>";
//                out.println(redir);
                String clave = request.getAttribute("clv") == null ? request.getParameter("clv") : request.getAttribute("clv").toString();
                request.setAttribute("clv", clave);

                getServletContext().getRequestDispatcher("/jsp/termycondi/carga.jsp").forward(request, response);
                //request.getRequestDispatcher("/").include(request, response);
                //request.getRequestDispatcher("/jsp/indice/footer.jsp").include(request, response);
            } else if (accion.equals("sv")) {
                int conds = request.getParameter("contador") == null ? 0 : Integer.parseInt(request.getParameter("contador"));
                String claveDoc = request.getParameter("clv");
                if (claveDoc != null) {
                    String msg = "";
                    for (int i = 0; i < conds; i++) {
                        Condicionante cond = new Condicionante();
                        cond.setDocumento(Documentos.instancia().obtenerPorId(claveDoc));
                        cond.setTipo(request.getParameter("tipo_" + (i + 1)));
                        cond.setNumero(request.getParameter("num_" + (i + 1)));
                        cond.setDescripcion(request.getParameter("desc_" + (i + 1)));
                        if (request.getParameter("cump_" + (i + 1)) != null) {
                            cond.setFechaCumplimiento(new Date()); // convertir a fecha de request.getParameter("fecha"+(i+1))
                            cond.setResponsable(request.getParameter("resp_" + (i + 1)));
                            if (request.getParameter("peri_" + (i + 1)) != null) {
                                cond.setPeriodicidad(request.getParameter("perio_" + (i + 1)));
                                cond.setDuracion(request.getParameter("dur_" + (i + 1)));
                            }
                        }
                        cond.setHistorico(new Historico(request.getSession().getAttribute("sUsuario").toString()));
                        Condicionantes.instancia().agregar(cond);
                        msg = "Se agreg&oacute; el ";
                        msg += cond.getTipo().equals("T") ? "T&eacute;rmino" : "Condicionante";
                        msg += ": " + cond.getDescripcion() + "<br/>";
                    }
                    out.println(msg + " para el Documento: " + claveDoc);
                }
            }//fin ac=sv
        } catch (Exception e) {
            out.println(e.getMessage());
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}
